package database

import (
	"github.com/google/uuid"
	"gopkg.in/guregu/null.v3"
)

type User struct {
	ID            uuid.UUID    `json:"id"`
	Name          null.String  `json:"name"`
	User_Name     null.String  `json:"user_name"`
	Email         null.String  `json:"email"`
	Phone         null.String  `json:"phone"`
	Sex           null.Int     `json:"sex"`
	Age           null.Int     `json:"age"`
	Info          null.String  `json:"info"`
	Password_Hash []byte       `json:"-"`
	User_Type     int          `json:"user_type"`
	Create_Date   jsonTime     `json:"create_date"`
	Operate_Date  jsonTime     `json:"operate_date"`
	Operator      uuid.UUID    `json:"operator"`
	Banned_Date   jsonNullTime `json:"banned_date"`
	Banned        int          `json:"banned"`
}

type UserOption func(*User)

type Model struct {
	ID               int64        `json:"id"`
	User_ID          uuid.UUID    `json:"user_id"`
	Name             string       `json:"name"`
	Type             int          `json:"type"`
	Model_Class      string       `json:"model_class"`
	Model_File_Bytes []byte       `json:"model_file_bytes"`
	Dependencies     null.String  `json:"dependencies"`
	Description      null.String  `json:"description"`
	Model_File_Type  int          `json:"model_file_type"`
	Model_File_Name  null.String  `json:"model_file_name"`
	Create_Date      jsonTime     `json:"create_date"`
	Operate_Date     jsonTime     `json:"operate_date"`
	Operator         uuid.UUID    `json:"operator"`
	Banned_Date      jsonNullTime `json:"banned_date"`
	Banned           int          `json:"banned"`
	Public           int          `json:"public"`
	Cur_Commit_ID    null.String  `json:"cur_commit_id"`
}

type Dataset struct {
	ID           int64        `json:"id"`
	User_ID      uuid.UUID    `json:"user_id"`
	Name         string       `json:"name"`
	Type         int          `json:"type"`
	Object       string       `json:"object"`
	Object_Type  int          `json:"object_type"`
	Token        null.String  `json:"token"`
	Description  null.String  `json:"description"`
	Create_Date  jsonTime     `json:"create_date"`
	Operate_Date jsonTime     `json:"operate_date"`
	Operator     uuid.UUID    `json:"operator"`
	Banned_Date  jsonNullTime `json:"banned_date"`
	Banned       int          `json:"banned"`
	Public       int          `json:"public"`
}

type Project struct {
	ID           int64        `json:"id"`
	User_ID      uuid.UUID    `json:"user_id"`
	Name         string       `json:"name"`
	Description  null.String  `json:"description"`
	Create_Date  jsonTime     `json:"create_date"`
	Operate_Date jsonTime     `json:"operate_date"`
	Operator     uuid.UUID    `json:"operator"`
	Banned_Date  jsonNullTime `json:"banned_date"`
	Banned       int          `json:"banned"`
}

type Project_Member struct {
	ID           int64        `json:"id"`
	User_ID      uuid.UUID    `json:"user_id"`
	Group_ID     string       `json:"group_id"`
	Role         int          `json:"role"`
	Description  null.String  `json:"description"`
	Create_Date  jsonTime     `json:"create_date"`
	Operate_Date jsonTime     `json:"operate_date"`
	Operator     uuid.UUID    `json:"operator"`
	Banned_Date  jsonNullTime `json:"banned_date"`
	Banned       int          `json:"banned"`
}

type Trainjob struct {
	ID                int64        `json:"id"`
	User_ID           uuid.UUID    `json:"user_id"`
	Name              string       `json:"name"`
	Version           int          `json:"version"`
	Type              int          `json:"type"`
	Project_ID        null.Int     `json:"project_id"`
	Description       null.String  `json:"description"`
	Budget            string       `json:"budget"`
	Train_Dataset_ID  int64        `json:"train_dataset_id"`
	Val_Dataset_ID    int64        `json:"val_dataset_id"`
	Model_Id          int64        `json:"model_id"`
	Model_Commit_ID   null.String  `json:"model_commit_id"`
	Model_Args        null.String  `json:"model_args"`
	Train_Args        null.String  `json:"train_args"`
	Status            int          `json:"status"`
	Param_Save_Object null.String  `json:"param_save_object"`
	Use_Automl        int          `json:"use_automl"`
	Max_Trials        int          `json:"max_trials"`
	Dest_Score        string       `json:"dest_score"`
	Datetime_Started  jsonTime     `json:"datetime_started"`
	Datetime_Stopped  jsonNullTime `json:"datetime_stopped"`
	Banned_Date       jsonNullTime `json:"banned_date"`
	Banned            int          `json:"banned"`
	Log               null.String  `json:"log"`
}

type App struct {
	ID               int64        `json:"id"`
	User_ID          uuid.UUID    `json:"user_id"`
	Name             string       `json:"name"`
	Type             int          `json:"type"`
	Train_Job_ID     int64        `json:"train_job_id"`
	Model_Id         int64        `json:"model_id"`
	Model_Commit_ID  null.String  `json:"model_commit_id"`
	Project_ID       int64        `json:"project_id"`
	Port             string       `json:"port"`
	Budget           string       `json:"budget"`
	ReplicasMin      int          `json:"replicas_min"`
	ReplicasMax      int          `json:"replicas_max"`
	Description      null.String  `json:"description"`
	Status           string       `json:"status"`
	Datetime_Started jsonTime     `json:"datetime_started"`
	Datetime_Stopped jsonNullTime `json:"datetime_stopped"`
	Banned_Date      jsonNullTime `json:"banned_date"`
	Banned           int          `json:"banned"`
	Log              null.String  `json:"log"`
}
